package ar.uade.distribuidas.tpo.srv.dao;

import java.io.InputStream;
import java.text.DateFormat;
import java.text.Normalizer;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;


import org.joda.time.LocalDate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import ar.uade.distribuidas.tpo.base.dominiodto.CondicionDeVentaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ProveedorDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.base.utils.FormatUtils;
import ar.uade.distribuidas.tpo.srv.delegado.BD;


public class ListaPrecioXmlDAO {

	private static ListaPrecioXmlDAO instancia;
	//private static String ARCHIVO = "lista-de-precios.xml";
	//public static Document doc;
	private BD bd;
	
	private ListaPrecioXmlDAO() {
		super();
		bd = BD.getInstance();
	}
/*
	private void createDocument(InputStream ARCHIVO){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
		//	doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	*/
	
	public static ListaPrecioXmlDAO getInstancia(InputStream filecontent) {
		if (instancia == null) {
			instancia = new ListaPrecioXmlDAO();
			//instancia.createDocument(filecontent);
		}
		return instancia;
	}

	public List<ListaPrecioDTO> recuperarListaPrecio(Document docu) {
		List<ListaPrecioDTO> lps = new ArrayList<ListaPrecioDTO>();
		NodeList nodos = docu.getElementsByTagName("ListaPrecios");
		for (int i = 0; i < nodos.getLength(); i++) {
			if (nodos.item(i).hasChildNodes()) {
				lps.add(mapStock((Element) nodos.item(i)));
			}
		}
		return lps;
	}

	private ListaPrecioDTO mapStock(Element eleListaP) {

		ListaPrecioDTO lp = new ListaPrecioDTO();
		Element auxElem;
		try {
			Element elemProv = (Element) eleListaP.getElementsByTagName("Cuil").item(0);
			//Proveedor prov = new Proveedor();
			
			Long cuil = ((Long.parseLong(elemProv.getTextContent())));
			//prov.setNombre(elemProv.getAttribute("RazonSocial")); No hace falta ya que sacamos el proveedor de la DB
			ProveedorDTO pr = null;//new Proveedor(pDTO.getCuil(), pDTO.getNombre());
			pr = bd.getProveedor(cuil);
			lp.setProveedor(pr);

			elemProv = (Element) eleListaP.getElementsByTagName("Vigencia").item(0);
			auxElem = (Element) elemProv.getElementsByTagName("Fecha").item(0);
			LocalDate fecha = LocalDate.now();
			try {
				 fecha = LocalDate.parse(auxElem.getTextContent(),
						FormatUtils.DATE_FORMATTER);
				lp.setFechaDesde(fecha.toString(FormatUtils.DATE_FORMATTER));
			} catch (Exception e) {
				lp.setFechaDesde(LocalDate.now().toString(FormatUtils.DATE_FORMATTER));
			}
			
			/*DateFormat df = new SimpleDateFormat(FormatUtils.DATE_PATTERN);
			lp.setFechaDesde((df.parse(auxElem.getTextContent()).t));*/

			auxElem = (Element) elemProv.getElementsByTagName("Termino").item(0);
			
			
		/*	try {
				LocalDate fecha = LocalDate.parse(auxElem.getTextContent(),
						FormatUtils.DATE_FORMATTER);
				lp.setFechaHasta(fecha.toString(FormatUtils.DATE_FORMATTER));
			} catch (Exception e) {
				lp.setFechaHasta(LocalDate.now().toString(FormatUtils.DATE_FORMATTER));
			}*/
			
			
			
			Calendar calendar = Calendar.getInstance();
			
			
			
			try{	
			calendar.setTime(fecha.toDate()); // Configuramos

			// la
			// fecha
			// que
			// se
			// recibe
				
				//String aux = auxElem.getTextContent();
				calendar.add(Calendar.DAY_OF_YEAR, Integer.valueOf(auxElem.getTextContent())); // numero
													// de
													// dias
				SimpleDateFormat sdf = new SimpleDateFormat(FormatUtils.DATE_PATTERN);																					// a
									// aniadir,
									// o
									// restar
				// en
				// caso
				// de
				// dias<0
			lp.setFechaHasta(sdf.format(calendar.getTime()));
			} catch (Exception e) {
				lp.setFechaHasta(LocalDate.now().toString(FormatUtils.DATE_FORMATTER));
			}
			
			Element CDVelem = (Element) eleListaP.getElementsByTagName("CondicionesDeVenta").item(0);
			NodeList nodosPoliticaDTOs = CDVelem.getChildNodes();
			CondicionDeVentaDTO condicion;
			List<CondicionDeVentaDTO> condiciones = new LinkedList<CondicionDeVentaDTO>();
			int iter = 0;
			while(iter<nodosPoliticaDTOs.getLength()){
				if(nodosPoliticaDTOs.item(iter).getNodeType() == Node.ELEMENT_NODE){ //Asumo que esta definido en el formato del
					Node nodo = (Node) nodosPoliticaDTOs.item(iter);					 //  XML que el primer elemento de "CondicionesDeVenta" es un medio de pago.
					auxElem = (Element) nodo;
					condicion = CondicionDeVentaXmlParser.parseCDV(auxElem);
					condiciones.add(condicion);
				}
				iter++;
			}
			lp.setCondicionesDeVenta(condiciones);

			
			
			Element rodamientoElem = (Element) eleListaP.getElementsByTagName("Rodamientos").item(0);
			NodeList items = rodamientoElem.getElementsByTagName("Item");
				
			for (int j = 0; j < items.getLength(); j++) {
				Node item = items.item(j);

				if (item.getNodeType() == Node.ELEMENT_NODE) {
					Element it = (Element) item;
					RodamientoDTO rodDTO = new RodamientoDTO(Long.parseLong(it.getAttribute("serie")), getValue("Sufijo", it),
							getValue("Marca", it), getValue("Origen", it));
					
						ItemListaPrecioDTO ip = new ItemListaPrecioDTO();
						auxElem = (Element) it.getElementsByTagName("Precio").item(0);
						Double costo = Double.valueOf(auxElem.getTextContent());
						ip.setListaPrecioId(lp.getIdLista());
						ip.setCosto(costo);	
						ip.setRodamiento(rodDTO);
						lp.addItem(ip);																								
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return lp;
	}

	private static String getValue(String tag, Element element) {
		NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes();
		Node node = (Node) nodes.item(0);
		if (node != null) {
			return node.getNodeValue();
		}
		return "";
	}
	/*
	private String quitarTildes(String original){
		   String sinTildes = null;
		   //Normalizamos en la forma NFD (Canonical decomposition)
		   original = Normalizer.normalize(original, Normalizer.Form.NFD);
		   //Reemplaza los tildes usando una expresi�n regular de Bloque Unicode
		   sinTildes = original.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
		    
		   return sinTildes;
		}
	*/
	

}
